import { createAlova } from 'alova';
import GlobalFetch from 'alova/GlobalFetch';
import VueHook from 'alova/vue';
import { TOKEN } from '@/constant';
import { ElMessage } from 'element-plus';
import { removeAllItem } from '@/utils/storage';
import router from '../router';

function getToken() {
  let token;
  token = localStorage.getItem(TOKEN);
  if (!token) {
    token = sessionStorage.getItem(TOKEN);
  }
  if (token) {
    return token;
  }
  return '';
}
export const alovaIns = createAlova({
  // 假设我们需要与这个域名的服务器交互
  baseURL: '',

  // 在vue项目下引入VueHook，它可以帮我们用vue的ref函数创建请求相关的，可以被alova管理的状态
  statesHook: VueHook,

  // 请求适配器，这里我们使用fetch请求适配器
  requestAdapter: GlobalFetch(),

  // 设置全局的请求拦截器，与axios相似
  beforeRequest({ config }) {
    // 假设我们需要添加token到请求头
    config.headers.Authorization = `Bearer ${getToken()}`;
    config.headers['Content-Type'] = 'application/json; charset=utf-8';
  },

  // 响应拦截器，也与axios类似
  responsed: async (response: any) => {
    const json = await response.json();
    if (response.status !== 200 || (!json.success && json.success != undefined)) {
      if (json.errMsg) {
        //没有token
        if (!getToken() && json.errCode === 401) {
          router.push('/login');
          throw new Error(json.errMsg);
          //token过期
        } else if (json.errCode === 402) {
          removeAllItem();
          router.push('/login');
          throw new Error(json.errMsg);
        } else {
          promptMessage(json.errMsg);
          throw new Error(json.errMsg);
        }
      } else {
        throw new Error(json.message);
      }
    }
    return json.data;
  }
});

function promptMessage(msg: string) {
  ElMessage({
    message: msg,
    type: 'warning'
  });
}
